//编写一个程序,打印输入中单词长度的直方图.水平方向的直方图比较容易绘制
//垂直方向的则要困难些
#include <stdio.h>
#define IN 1            //单词内
#define OUT 0           //单词外
#define MAX 16          //单词最大长度
#define MAXHIST 20      //打印的一条最大长度

int main()
{
    int c, i, j, state;
    int words_len_count[MAX];                   //索引0-14 对应长度 1-15 最后索引记录长度大于15的单词个数
    int len;                                    //每一条的长度
    int nc;                                     //单词长度计数和单词个数计数
    int nc_max;                                 //单词长度频次最大的值

    for (i = 0; i < MAX; ++i)
        words_len_count[i] = 0;      
    state = OUT;
    nc_max = -1;
    
    //输入并统计各长度的单词的频次
    while ((c = getchar()) != EOF)
    {
        if (c == ' ' || c == '\t' || c == '\n') //如果是空白字符,出单词,并且nc置0
        {
            if (nc > 0)
            {
                if (nc >= MAX)
                    ++words_len_count[MAX - 1];
                else
                    ++words_len_count[nc - 1];  //添加到记录各单词长度频次的数组中
            }
            state = OUT;                        //出单词
            nc = 0;                             //重置单词记录的长度
        }
        else if (state == OUT)                  //如果不是空白字符,同时在单词外,开始计数,state置IN
        {
            state = IN;                         //入单词
            nc = 1;                             //开始记录单词的长度
        }
        else
            ++nc;                               //在单词内,每次读到不是空白字符就++
    }
    //得到单词长度频次最大的值
    for (i = 0; i < MAX; ++i)
    {
        if (words_len_count[i] > nc_max)
            nc_max = words_len_count[i];
    }
    //打印水平方向直方图
    for (i = 0; i < MAX; ++i)
    {
        if (i == MAX - 1)
            printf(">=16\t:");
        else
            printf("%d\t:", i + 1);
        if (words_len_count[i] > 0)
        {
            if ((len = words_len_count[i] * MAXHIST / nc_max) <= 0)
                len = 1;
        }         
        else
            len = 0;
        while (len > 0)
        {
            putchar('*');
            --len;
        }
        printf("\n");
    }
    //打印垂直方向直方图
    //打印表头
    for (i = 0; i < MAX; ++i)
    {
        if (i == MAX - 1)
            printf(">=16\t");
        else 
            printf("%d\t", i + 1);
    }
    printf("\n");
    //打印 *
    for (i = 0; i < nc_max; ++i)
    {
        for (j = 0; j < MAX; ++j)
        {
            if (words_len_count[j] > 0)
            {
                printf("*\t");
                --words_len_count[j];               //每打印一次对应长度个数减1
            }
            else
                printf("\t");
        }
        printf("\n");                               //每过一行打印一个换行符
    }
    return 0;
}